package com.weipu.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.text.TextUtils;

import com.weipu.common.DXApplication;
import com.weipu.dx_lib.R;

/**
 * 字符串帮助类
 *
 * @author hjd008
 * @version [版本号, 2013-1-16]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */

public final class StringUtil {

    /**
     * preferences file name
     */
    private static final String PREFERENCES_FILE_NAME = "config";

    private static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    private static final SimpleDateFormat TIMEZON_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    private StringUtil() {
    }

    /**
     * 搜索功能模糊查询 Filter out 特殊字符： `  ~ ! @ #  $ %  ^ & * （） - _ = + [ ( ) } \ | ; [ { ] } < . > / ?
     * DMS 涉及搜索引擎 暂次处理方式
     *
     * @param queryStr String
     * @return String
     */
    public static String strFilterOut(String queryStr) {
        StringBuffer strBuf = new StringBuffer();
        if (queryStr == null || "".equals(queryStr.trim())) {
            return "";
        } else {
            for (int i = 0; i < queryStr.length(); i++) {
                char temp = queryStr.charAt(i);
                if (temp == '`' || temp == '~' || temp == '!' || temp == '@' || temp == '#' || temp == '$'
                        || temp == '%' || temp == '^' || temp == '&' || temp == '*' || temp == '（' || temp == '）'
                        || temp == '-' || temp == '_' || temp == '=' || temp == '[' || temp == '(' || temp == ')'
                        || temp == '}' || temp == '\\' || temp == '|' || temp == ';' || temp == '[' || temp == '{'
                        || temp == ']' || temp == '}' || temp == '<' || temp == '.' || temp == '>' || temp == '/'
                        || temp == '?' || temp == '¥' || temp == '€' || temp == '£') {
                    strBuf.append("");
                } else {
                    strBuf.append(temp);
                }
            }
            return strBuf.toString();
        }
    }

    /**
     * Url里参数处理模糊查询中特殊字符  空格    " #  %  & (   )  +    , /  :  ;  <   =   >   ?  @  \  |
     * 将其转换为  使其能作为正常字符作为查询条件：
     * %20  %22  %23  %25  %26  %28 %29  %2B %2C  %2F  %3A %3B  %3C %3D %3E  %3F %4o %5C %7C
     *
     * @param queryStr String
     * @return String
     */
    public static String strFilter(String queryStr) {
        StringBuffer strBuf = new StringBuffer();
        if (queryStr == null || "".equals(queryStr.trim())) {
            return "";
        } else {
            for (int i = 0; i < queryStr.length(); i++) {
                char temp = queryStr.charAt(i);
                if (temp == ' ') {
                    strBuf.append("%20");
                } else if (temp == '\"') {
                    strBuf.append("%22");
                } else if (temp == '#') {
                    strBuf.append("%23");
                } else if (temp == '%') {
                    strBuf.append("%25");
                } else if (temp == '&') {
                    strBuf.append("%26");
                } else if (temp == '(') {
                    strBuf.append("%28");
                } else if (temp == ')') {
                    strBuf.append("%29");
                } else if (temp == '+') {
                    strBuf.append("%2B");
                } else if (temp == ',') {
                    strBuf.append("%2C");
                } else if (temp == '/') {
                    strBuf.append("%2F");
                } else if (temp == ':') {
                    strBuf.append("%3A");
                } else if (temp == ';') {
                    strBuf.append("%3B");
                } else if (temp == '<') {
                    strBuf.append("%3C");
                } else if (temp == '=') {
                    strBuf.append("%3D");
                } else if (temp == '>') {
                    strBuf.append("%3E");
                } else if (temp == '?') {
                    strBuf.append("%3F");
                } else if (temp == '@') {
                    strBuf.append("%4o");
                } else if (temp == '\\') {
                    strBuf.append("%5C");
                } else if (temp == '|') {
                    strBuf.append("%7C");
                } else {
                    strBuf.append(temp);
                }
            }
            return strBuf.toString();
        }
    }

    /**
     * 格式化商品价格,转换为 0.00 格式
     *
     * @param price
     * @return
     */
    public static String getPrice(double price) {
        return getPrice(String.valueOf(price));
    }

    /**
     * 格式化商品价格,转换为 0.00 格式
     *
     * @param price
     * @return
     */
    public static String getPrice(String price) {
        //空字符
        if (null == price || "".equals(price.trim())) {
            return "";
        }

        //非整数或小数
        if (!(isDigital(price) || isDouble(price))) {
            return price;
        }

        int index = price.indexOf('.');

        //无小数部分
        if (-1 == index) {
            return price + ".00";
        }

        //整数部分
        String prefix = price.substring(0, index);

        //小数部分
        String postfix = price.substring(index + 1);

        StringBuilder result = new StringBuilder();

        //小数部分长度
        switch (postfix.length()) {
            //无小数部分
            case 0:
                result.append(prefix).append(".00");
                break;
            //只有一位小数
            case 1:
                result.append(prefix).append('.').append(postfix).append('0');
                break;
            //两位小数
            case 2:
                result.append(prefix).append('.').append(postfix);
                break;
            //三位或以上小数,需要进行四舍五入
            default:
                String t = String.valueOf(Math.round(Double.parseDouble(postfix.substring(0, 3)) / 10));
                //不足两位补0
                if (t.length() < 2) {
                    t = t + "0";
                }
                //进位
                else if (t.length() > 2) {
                    prefix = String.valueOf(Integer.parseInt(prefix) + 1);
                    t = t.substring(1);
                }

                //拼接整数与小数部分
                result.append(prefix).append('.').append(String.valueOf(t));
                break;
        }
        return result.toString();
    }

    /**
     * 判断字符是否带小数
     *
     * @param str
     * @return
     */
    public static boolean isDouble(String str) {
        if (TextUtils.isEmpty(str)) {
            return false;
        }
        if (isDigital(str)) {
            return true;
        }
        return str.matches("(-)?\\d+\\.\\d+");
    }

    /**
     * 判断字符是否数字
     *
     * @param str
     * @return
     */
    public static boolean isDigital(String str) {
        if (TextUtils.isEmpty(str)) {
            return false;
        }
        return str.matches("(-)?\\d+");
    }

    /**
     * 字符串转int
     *
     * @param input        要求被转换的字符串
     * @param defaultValue 转化失败后的默认值
     * @return
     */
    public static int parsetInt(String input, int defaultValue) {
        if (TextUtils.isEmpty(input)) {
            return defaultValue;
        }

        if (TextUtils.isDigitsOnly(input)) {
            return Integer.parseInt(input);
        }

        return defaultValue;
    }

    /**
     * 格式化日期格式
     *
     * @param src 日期格式 毫秒数 '+' 时区
     *            一个输入示例: 1277114310487+0800 或 /date(1277114310487+0800)/
     * @return String [返回类型说明]
     * @throws throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static String dateFormate(String src) {
        if (TextUtils.isEmpty(src)) {
            return "";
        }
        int left = src.indexOf('(');

        if (-1 != left) {
            src = src.substring(left + 1);
        }

        int right = src.indexOf(')');
        if (-1 != right) {
            src = src.substring(0, right);
        }
        int idx = src.indexOf('+');
        if (-1 == idx) {
            idx = src.indexOf('-');
            if (-1 == idx) {
                return src;
            }
        }
        String millis = src.substring(0, idx);
        String zone = src.substring(idx + 1);
        if (!TextUtils.isDigitsOnly(millis) || !TextUtils.isDigitsOnly(zone)) {
            return src;
        }
        TIMEZON_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone(src.substring(idx)));
        return dateFormate(new Date(Long.parseLong(millis)));
    }

    /**
     * 格式化日期格式
     *
     * @param src     日期格式 毫秒数 '+' 时区
     *                一个输入示例: 1277114310487+0800 或 /date(1277114310487+0800)/
     * @param formate 日期格式
     * @return String [返回类型说明]
     * @throws throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static String dateFormate(String src, String formate) {
        if (TextUtils.isEmpty(src)) {
            return "";
        }
        int left = src.indexOf('(');

        if (-1 != left) {
            src = src.substring(left + 1);
        }

        int right = src.indexOf(')');
        if (-1 != right) {
            src = src.substring(0, right);
        }
        int idx = src.indexOf('+');
        if (-1 == idx) {
            idx = src.indexOf('-');
            if (-1 == idx) {
                return src;
            }
        }
        String millis = src.substring(0, idx);
        String zone = src.substring(idx + 1);
        if (!TextUtils.isDigitsOnly(millis) || !TextUtils.isDigitsOnly(zone)) {
            return src;
        }
        SimpleDateFormat ss = new SimpleDateFormat(formate);
        ss.setTimeZone(TimeZone.getTimeZone(src.substring(idx)));
        return ss.format(new Date(Long.parseLong(millis)));
    }

    /**
     * 格式化日期
     *
     * @param date
     * @return String [返回类型说明]
     * @throws throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static String dateFormate(Date date) {
        if (null == date) {
            return "";
        }
        return DEFAULT_DATE_FORMAT.format(date);
    }

    /**
     * 验证字符串是否email格式
     *
     * @param email
     * @return boolean [返回类型说明]
     * @throws throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static boolean isEmail(String email) {
        if (TextUtils.isEmpty(email)) {
            return false;
        }
        return email.matches("^(\\w|\\.|-|\\+)+@(\\w|-)+(\\.(\\w|-)+)+$");
    }

    /**
     * 验证字符串是否有a-z|A-Z|0-9组成
     *
     * @param username
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static boolean isUsername(String username) {
        if (TextUtils.isEmpty(username)) {
            return false;
        }
        return username.matches("[a-zA-Z0-9]+");

    }

    /**
     * 验证字符串是否是有字幕a-z或A-Z组成
     *
     * @param username
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static boolean isFirstnameOrLastname(String username) {
        if (TextUtils.isEmpty(username)) {
            return false;
        }
        return username.matches("^[0-9a-zA-Z\u4E00-\u9FA5 ]+$");

    }

    /**
     * url参数解析
     *
     * @param url 一个键值对的地址以'?'、'&'进行分隔，以'='拼接key与value,例如: name=admin&pwd=123456
     * @return 已键值对方式返回解析后参数与值
     */
    public static Map<String, String> getParameter(String url) {
        if (TextUtils.isEmpty(url)) {
            return null;
        }
        //分隔参数为字符串数组(格式: key=value)
        String[] paras = url.split("\\?|\\&");

        HashMap<String, String> result = new HashMap<String, String>(paras.length);
        String[] tmp = null;
        for (String prefix : paras) {
            tmp = prefix.split("=", 2);
            if (tmp.length == 2) {
                result.put(tmp[0], tmp[1]);
            }
        }
        return result;
    }

    /**
     * 保存用户名和密码
     *
     * @param context
     * @param config  [参数说明]
     * @return void [返回类型说明]
     * @throws throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static void saveConfig(Context context, HashMap<String, String> config) {
        if (null == context || null == config || config.isEmpty()) {
            return;
        }
        //配置文件
        SharedPreferences pre = context.getSharedPreferences(PREFERENCES_FILE_NAME, Context.MODE_PRIVATE);
        //编辑
        Editor edit = pre.edit();
        Set<String> key = config.keySet();
        String value = null;
        for (String k : key) {
            value = config.get(k);
            if (TextUtils.isEmpty(value)) {
                edit.remove(k);
            } else {
                edit.putString(k, value);
            }
        }
        //提交
        edit.commit();
    }

    /**
     * 读取指定配置项，如果不存在则返回空字符串
     *
     * @param ctx
     * @param key
     * @return String [返回类型说明]
     * @throws throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static String getConfig(Context ctx, String key) {
        if (null == ctx || TextUtils.isEmpty(key)) {
            return null;
        }
        return ctx.getSharedPreferences(PREFERENCES_FILE_NAME, Context.MODE_PRIVATE).getString(key, "");
    }

    /**
     * 读取指定配置项，如果不存在则返回空字符串
     *
     * @param key          配置的key
     * @param defaultValue 默认值
     * @return String [返回类型说明]
     * @throws throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static String getConfig(String key, String defaultValue) {
        if (TextUtils.isEmpty(key)) {
            return defaultValue;
        }

        return DXApplication.getContext()
                .getSharedPreferences(PREFERENCES_FILE_NAME, Context.MODE_PRIVATE)
                .getString(key, defaultValue);
    }

    /**
     * 判断是否本地xml有该key的存在
     *
     * @param key
     * @return
     */
    public static boolean isContainKey(String key) {
        SharedPreferences sharedPre = DXApplication.getContext().getSharedPreferences(PREFERENCES_FILE_NAME, Context.MODE_PRIVATE);
        if (null == sharedPre) {
            return false;
        }
        return sharedPre.contains(key);
    }

    /**
     * 保存配置
     *
     * @param key   配置的key
     * @param value 默认值
     * @throws throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static void saveConfig(String key, String value) {
        if (TextUtils.isEmpty(key)) {
            return;
        }

        Editor edit =
                DXApplication.getContext().getSharedPreferences(PREFERENCES_FILE_NAME, Context.MODE_PRIVATE).edit();
        if (null == value) {
            edit.remove(key);
        } else {
            edit.putString(key, value);
        }

        edit.commit();
    }

    /**
     * 批量读取配置项，如果key对应的value不存在则返回空字符串
     *
     * @param ctx
     * @param key
     * @return HashMap<String,String> [返回类型说明]
     * @throws throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static HashMap<String, String> getConfig(Context ctx, String[] key) {
        if (null == ctx || null == key || key.length < 1) {
            return null;
        }
        //读取配置文件
        SharedPreferences pre = ctx.getSharedPreferences(PREFERENCES_FILE_NAME, Context.MODE_PRIVATE);
        if (null == pre) {
            return null;
        }
        HashMap<String, String> result = new HashMap<String, String>(key.length);
        for (int i = 0; i < key.length; i++) {
            result.put(key[i], pre.getString(key[i], ""));
        }
        return result;
    }

}
